/**
 * Version a0.5
 *      Komplettes ueberarbeiten der Queue:
 *          implementierung als Ringbuffer
 *          Klasse jedoch ungeprueft!!!
 */
package ueb13.htw.queue;

import java.nio.BufferOverflowException;

/**
 * Implementierung einer Queue mittels Ringbuffer mit fester groesse. 
 * 
 * @author Andreas Dier, Steffen Schuhmann 
 * @version a0.5
 */
public class Queue 
{

    private static final String PREFIX              = "->";
    private static final String NEWLINE             = "\n";
    
    private static final int    STDSIZE             = 50;
    
    private Object queue[]  = null;
    private int first       = 0;
    private int next        = 0;
    private int size        = 0;
    
    /** 
     * Array erzeugen 
     */

    public Queue(int size) {
        queue = new Object[size];       
    }
    
    public Queue() {
        this(STDSIZE);
    }

    
    /**
     * Annhaengen eines Elementes an das Ende der Schlange.
     * 
     * @param element Das einzufuegende Element
     */
    public void enqueue(Object element) {
        if(size >= queue.length)
            throw new BufferOverflowException();
        queue[next] = element;
        if(size != queue.length) {
            if(next == queue.length) {
                next = 0;
            } else {
                next++;
            }   
        }
        size++;
    }
    
    /**
     * Gibt das erste Element der Liste zurueck, dabei wird das Element aus 
     * der Liste geloescht.
     * 
     * @return Das erste Element er Liste.  
     */

    public Object dequeue() {
        if(size == 0)
            throw new NullPointerException();
        size--;
        if(first == queue.length) {
            first = 0;
            return queue[queue.length - 1];
        } else {
            return queue[first++];
        }        
    }
    
    /** 
     * Das erste Element zurueckgeben, falls die Schlange leer ist wird
     * null zurueckgegeben.
     * 
     * @return das erste Object
     */
    public Object peek() {
        if(size == 0)
            return null;
        return queue[first];
    }

    /** 
     * Das letzte Element zurueckgeben, falls die Schlange leer ist wird 
     * null zurueckgegeben.  
     * 
     * @return das letzte Object
     */

    public Object poll() {
        if(size == 0) 
            return null;
        return queue[next - 1];
    }


    /**
     * @return Anzahl der Elemente
     */
    public int size() {
        return size;
    }
    
    /**
     * @return Queue als Zeichenkette
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int i = first; i != next; i++ ) {
            if(i == queue.length) 
                i = 0;
            sb.append(PREFIX);
            sb.append(queue[i].toString());
            sb.append(NEWLINE);
        }          
        return sb.toString();
    }
}